package org.wheel.plugins.toolkit.jdbc.pool.util;

import org.springframework.boot.jdbc.DatabaseDriver;

import javax.sql.DataSource;

public class DatabaseTypeUtil {

    /**
     * 通过 JDBC URL 判断数据库类型（支持国内外常见数据库）
     * <pre>
     * | 数据库类型         | JDBC URL 示例                     |
     * | ---------------- | --------------------------------- |
     * | MySQL            | `jdbc:mysql://host:3306/db`       |
     * | Oracle           | `jdbc:oracle:thin:@host:1521:SID` |
     * | PostgreSQL       | `jdbc:postgresql://host:5432/db`  |
     * | SQLServer        | `jdbc: SQLServer                  |
     * | DB2              | `jdbc:db2://host:50000/db`        |
     * | 达梦DM            | `jdbc:dm://host:5236/SYSDBA`      |
     * | 人大金仓Kingbase   | `jdbc:kingbase8://host:54321/db`  |
     * | 神通数据库         | `jdbc:oscar://host:2003/db`       |
     * | 高斯GaussDB       | `jdbc:gaussdb://host:8000/db`     |
     * | OceanBase        | `jdbc:oceanbase://host:2881/db`   |
     * | ClickHouse       | `jdbc:clickhouse://host:8123/db`  |
     * | TiDB             | `jdbc:tidb://host:4000/db`        |
     * </pre>
     */
    public static String getDatabaseTypeByUrl(String jdbcUrl) {
        if (jdbcUrl == null || jdbcUrl.trim().isEmpty()) {
            return "Unknown";
        }

        // 统一转为小写方便匹配
        String url = jdbcUrl.toLowerCase();

        // 匹配规则（按优先级排序）
        if (url.startsWith("jdbc:mysql:") || url.contains(":mysql://")) {
            return "MySQL";
        } else if (url.startsWith("jdbc:oracle:") || url.contains(":oracle:")) {
            return "Oracle";
        } else if (url.startsWith("jdbc:postgresql:") || url.contains(":postgresql:")) {
            return "PostgreSQL";
        } else if (url.startsWith("jdbc:sqlserver:") || url.contains(":sqlserver:")) {
            return "SQLServer";
        } else if (url.startsWith("jdbc:db2:")) {
            return "DB2";
        } else if (url.startsWith("jdbc:h2:")) {
            return "H2";
        } else if (url.startsWith("jdbc:hsqldb:")) {
            return "HSQLDB";
        } else if (url.startsWith("jdbc:sqlite:")) {
            return "SQLite";
        } else if (url.startsWith("jdbc:dm:") || url.contains(":dm7:") || url.contains(":dm8:")) {
            return "DM"; // 达梦数据库
        } else if (url.startsWith("jdbc:kingbase:") || url.contains(":kingbase8:")) {
            return "Kingbase"; // 人大金仓
        } else if (url.startsWith("jdbc:oscar:") || url.contains(":oscar:")) {
            return "ShenTong"; // 神通数据库
        } else if (url.startsWith("jdbc:gaussdb:") || url.contains(":gaussdb:")) {
            return "GaussDB"; // 华为高斯数据库
        } else if (url.startsWith("jdbc:oceanbase:")) {
            return "OceanBase"; // 蚂蚁 OceanBase
        } else if (url.startsWith("jdbc:clickhouse:")) {
            return "ClickHouse";
        } else if (url.startsWith("jdbc:mariadb:")) {
            return "MariaDB";
        } else if (url.startsWith("jdbc:tidb:")) {
            return "TiDB";
        } else if (url.startsWith("jdbc:kingbasees:")) {
            return "KingbaseES"; // 人大金仓分布式版
        }

        // 其他未知类型
        return "Unknown";
    }

    /**
     * Spring工具类获取数据库类型
     * @param dataSource
     * @return
     */
    public static String getDatabaseType(DataSource dataSource) {
        try {
            String url = dataSource.getConnection().getMetaData().getURL();
            DatabaseDriver driver = DatabaseDriver.fromJdbcUrl(url);
            return driver.name(); // 返回枚举值（如 MYSQL、ORACLE等）
        } catch (Exception e) {
            return "Unknown";
        }
    }
}
